/*
 *http://www.apache.org/licenses/LICENSE-2.0
 * Copyright (c) 2021 fullset
 * @Description:计算工具类
 * @author: pangps     
 * @date: 2021/5/29 11:22
 */
package com.fs.core.util;

import java.math.BigDecimal;
import java.math.MathContext;

public class BigDecimalUtil {
	
	/**
	 * double 相加
	 * @param d1 加数1
	 * @param d2 加数2
	 * @return 计算结果
	 */
	public static double addDouble(double d1, double d2){
		if(Double.isInfinite(d1) || Double.isInfinite(d2)){
			return d1 + d2;
		}
		BigDecimal b1 = new BigDecimal(Double.toString(d1));
		BigDecimal b2 = new BigDecimal(Double.toString(d2));
		return b1.add(b2).doubleValue();
	}
	
	/**
	 * double 相减
	 * @param d1 被减数
	 * @param d2 减数
	 * @return 计算结果
	 */
	public static double subDouble(double d1, double d2){
		if(Double.isInfinite(d1) || Double.isInfinite(d2)){
			return d1 - d2;
		}
		BigDecimal b1 = new BigDecimal(Double.toString(d1));
		BigDecimal b2 = new BigDecimal(Double.toString(d2));
		return b1.subtract(b2).doubleValue();
	}
	
	/**
	 * double 相乘
	 * @param d1 乘数1
	 * @param d2 乘数2
	 * @return 计算结果
	 */
	public static double mulDouble(double d1, double d2){
		if(Double.isInfinite(d1) || Double.isInfinite(d2)){
			return d1 * d2;
		}
		BigDecimal b1 = new BigDecimal(Double.toString(d1));
		BigDecimal b2 = new BigDecimal(Double.toString(d2));
		return b1.multiply(b2).doubleValue();
	}
	
	/**
	 * 带精度范围的 double 相乘
	 * @param d1 乘数1
	 * @param d2 乘数2
	 * @param precision 精度
	 * @return 计算结果
	 */
	public static double mulDoubleWithPrecision(double d1, double d2, int precision){
		if(Double.isInfinite(d1) || Double.isInfinite(d2)){
			return d1 * d2;
		}
		BigDecimal b1 = new BigDecimal(Double.toString(d1));
		BigDecimal b2 = new BigDecimal(Double.toString(d2));
		MathContext mc = new MathContext(precision);
		return b1.multiply(b2, mc).doubleValue();
	}
	
	/**
	 * double 相除
	 * @param d1 被除数
	 * @param d2 除数
	 * @return 计算结果
	 */
	public static double divDouble(double d1, double d2){
		if(Double.isInfinite(d1) || Double.isInfinite(d2)){
			return d1 / d2;
		}
		BigDecimal b1 = new BigDecimal(Double.toString(d1));
		BigDecimal b2 = new BigDecimal(Double.toString(d2));
		return b1.divide(b2, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
	
	/**
	 * 带精度范围的 double 相除
	 * @param d1 被除数
	 * @param d2 除数
	 * @param scale 精度范围
	 * @return 计算结果
	 */
	public static double divDoubleWithScale(double d1, double d2, int scale){
		if(Double.isInfinite(d1) || Double.isInfinite(d2)){
			return d1 / d2;
		}
		BigDecimal b1 = new BigDecimal(Double.toString(d1));
		BigDecimal b2 = new BigDecimal(Double.toString(d2));
		return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 精度设置
	 * @param value
	 * @param scale
	 * @return
	 */
	public static String settingPrecision(String value, int scale){
		try{
			Double truncatedDouble = BigDecimal.valueOf(Double.parseDouble(value))
					.setScale(scale, BigDecimal.ROUND_HALF_UP)
					.doubleValue();
			value = String.valueOf(truncatedDouble);
			return value;
		} catch (Exception e) {
			return value;
		}
	}

	public static float algebraArg(float d1, float d2){
		if(Float.isInfinite(d1) || Float.isInfinite(d2)){
			throw new NumberFormatException("Infinite or NaN!");
		}
		return (float) Math.sqrt(Math.pow(d1,2) + Math.pow(d2,2));
	}

	public static void main(String[] args) {
		System.out.println(settingPrecision("24.86590869666314", 0));
	}
}
